package com.hejia.alauda.service;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.springframework.transaction.annotation.Transactional;

import com.hejia.alauda.entity.Account;
import com.hejia.alauda.entity.Balance;
import com.hejia.alauda.entity.BalanceOperation;
import com.hejia.alauda.entity.BankCard;
import com.hejia.alauda.entity.Credit;
import com.hejia.alauda.entity.Feedback;
import com.hejia.alauda.entity.Financing;
import com.hejia.alauda.entity.Invitation;
import com.hejia.alauda.entity.User;
import com.hejia.alauda.entity.UserInformation;
import com.hejia.alauda.entity.example.AccountExample;
import com.hejia.alauda.entity.example.InvitationExample;
import com.hejia.alauda.entity.example.UserExample;
import com.hejia.alauda.exception.BusinessException;
import com.hejia.alauda.utils.Pager;

/**
 * Created by Johnny(johnny@hejiajinrong.com) on 14-9-4.
 */
public interface UserService extends BaseService<User>{

	/**
	 * 根据身份证号找用户
	 * 
	 * @param mobile
	 * @return
	 */
	User findUserByIdCard(String idCard, Long id);
	

	/**
	 * 根据用户外部ID获取用户
	 * 
	 * @param external
	 * @return
	 */
	User findUserByExternal(String external);

	/**
	 * 根据微信的openid找用户
	 * 
	 * @param mobile
	 * @return
	 */
	User findUserByOpenId(String openid);

	/**
	 * 根据手机号找用户
	 * 
	 * @param mobile
	 * @return
	 */
	User findUserByMobile(String mobile);

	/**
	 * 根据userKey查询唯一用户
	 * 
	 * @param userKey
	 * @return
	 */
	User findUserByUserKey(String userKey);

	/**
	 * 查找用户
	 * 
	 * @param keyword
	 *            查询手机号、姓名、身份证号码
	 * @param pager
	 *            分页
	 * @return 用户列表
	 */
	Pager<User> findUsersByKeyword(String keyword, Pager<User> pager);

	/**
	 * 根据ID获取用户对象
	 * 
	 * @param id
	 * @return
	 */
	User findUserById(Long id);

	/**
	 * 通过手机号（就是用户名）找到数量
	 * 
	 * @param mobile
	 * @return
	 */
	int findUserCountByMobile(String mobile);

	/**
	 * 发送验证码
	 * 
	 * @param mobile
	 */
	String sendIdentifyingCode(String mobile);

	/**
	 * 增加用户信息
	 * 
	 * @param user
	 * @return
	 */
	boolean addUser(User user);
	
	boolean addUser(User user, User inviter);

	/**
	 * 修改用户信息
	 * 
	 * @param user
	 * @return
	 */
	boolean modifyUser(User user);

	/**
	 * 查询手机号码的验证码（未过期）
	 * 
	 * @param mobile
	 * @param identifyingcode
	 */
	String getIdentifyingCode(String mobile);

	/**
	 * 检查用户的数据完整性（每个用户实例包含唯一一个balance/credit/userinformation）
	 * 
	 * @return
	 */
	boolean checkUserIntegrity();

	/**
	 * 根据用户的ID获得用户的金融账户
	 * 
	 * @param id
	 * @return
	 */
	Balance findUserBalance(Long id);

	/**
	 * 根据用户ID获取每日的收益
	 * 
	 * @param id
	 * @return
	 */
	BigDecimal caculateDayInterestByUserId(Long id);

	/**
	 * 保存用户登录记录
	 * 
	 * @param user
	 * @return
	 */
	boolean addLoginHistory(User user, boolean isSuccess, String loginType,
			String ip, String city, String description);

	/**
	 * 根据用户的ID获得投资记录
	 * 
	 * @param user
	 * @return
	 */
	Pager<Map<String, Object>> findFinancingByUserId(User user,
			Pager<Map<String, Object>> pager, String statusStr);

	Double findTotalAmountByUserId(User user);

	/**
	 * 重置用户密码
	 * 
	 * @param id
	 *            用户ID
	 * @return 用户
	 */
	@Transactional(readOnly = false, rollbackFor = Exception.class)
	User resetUserPassword(long id);

	/**
	 * 保存用户反馈
	 * 
	 * @param feedback
	 * @return
	 */
	boolean saveFeedback(Feedback feedback);

	/**
	 * 增加用户红包
	 * 
	 * @param amount
	 * @return
	 */
	boolean addBalanceOperation(Double amount, User user,
			BalanceOperation.Type type);

	/**
	 * 用户购买成功发送短信
	 * 
	 * @param mobile
	 */
	void sendSuccessMessage(Financing financing);

	/**
	 * 用户购买成功发送短信给邀请人
	 * 
	 * @param mobile
	 */
	void sendInvitationMessage(Financing financing);

	/**
	 * 根据真实姓名模糊查找用户列表
	 *
	 * @param realName
	 *            真实姓名
	 * @param pager
	 *            分页信息
	 * @return 用户列表
	 */
	List<User> findUsersByRealNameWithLike(String realName, Pager<User> pager);

	/**
	 * 根据条件查询用户
	 * 
	 * @param example
	 * @return
	 */
	User findUserByExample(UserExample example);

	/**
	 * 更新所有用户的外部ID
	 */
	void updateUsersExternal();

	/**
	 * 保存邀请信息
	 * 
	 * @param entity
	 * @return
	 */
	boolean saveInvitation(Invitation entity);

	/**
	 * 增加邀请信息
	 * 
	 * @param invitee
	 *            被邀请人
	 * @param inviter
	 *            邀请人
	 * @param type
	 *            邀请类型
	 * @return
	 */
	boolean addInvitation(User invitee, User inviter, Integer type);

	/**
	 * 查询登录用户的分享战绩
	 * 
	 * @param user
	 * @return
	 */
	List<Invitation> findInvitationByUser(User user);

	/**
	 * 查询登录用户的分享战绩
	 * 
	 * @param user
	 * @return
	 */
	Invitation findInvitation1(User user);

	/**
	 * 注册成功后发送短信
	 * 
	 * @param mobile
	 */
	void sendMessageAfterRegister(String mobile);

	/**
	 * 根据ID查找用户额外信息
	 * 
	 * @param id
	 * @return
	 */
	UserInformation findUserInformationById(Long id);

	/**
	 * 根据条件查找邀请信息
	 * 
	 * @return
	 */
	List<Invitation> findInvitationByExample(InvitationExample example,
			Pager<Invitation> pager);

	/**
	 * 根据条件查找邀请信息--行数
	 * 
	 * @return
	 */
	int findInvitationCountByExample(InvitationExample example);

	/**
	 * 根据ID更新Invitation表
	 * 
	 * @param invitation
	 * @return
	 */
	int updateInvitationById(Invitation invitation);

	/**
	 * 计算虚拟理财金的利息
	 * 
	 * @param params
	 */
	int updateFinancialIncome();

	/**
	 * 处理过期未兑付的虚拟理财金利息
	 * 
	 * @param params
	 */
	int updateFinancialExpired(Map<String, Object> params);

	/**
	 * 将收益加入到用户的balance的现金字段中
	 * 
	 * @return
	 */
	int updateBalanceCash();

	/**
	 * 将收益加入到用户的balance的现金字段中
	 * 
	 * @return
	 */
	int updateBalanceCashed(Double cash, User user);

	/**
	 * 根据ID查询用户的积分信息
	 * 
	 * @param id
	 * @return
	 */
	Credit findCreditById(Long id);

	/**
	 * 根据IP获得查询
	 * 
	 * @return
	 */
	int findUserCountByIp(String ip);

	/**
	 * 修改用户的其他信息
	 * 
	 * @param userInformation
	 * @return
	 */
	int updateUserInformation(UserInformation userInformation);

	/**
	 * 变更手机号
	 * 
	 * @param userId
	 *            用户ID
	 * @param newMobile
	 *            新手机号
	 * @throws BusinessException
	 */
	@Transactional(readOnly = false, rollbackFor = Exception.class)
	void changeMobile(Long userId, String newMobile) throws BusinessException;

	/**
	 * 春节放假期间快客渠道的用户如果购买了就发送短信通知延后打话费
	 */
	void sendUniversalMessage(String mobile, String text, String channel);

	/**
	 * 查询出所有的用户
	 * 
	 * @return
	 */
	List<User> findAllUsers();

	/**
	 * 按用户信息ID列表查询
	 * 
	 * @param userInformationIds
	 *            用户信息ID列表
	 * @return 用户信息列表
	 */
	List<UserInformation> findUserInformationsByIds(
			List<Long> userInformationIds);

	/**
	 * 查询用户来源名称
	 * 
	 * @param referee
	 *            来源
	 * @return
	 */
	String findRefereeNameByReferee(String referee);

	/**
	 * 根据用户id查银行卡
	 * 
	 * @param id
	 * @return
	 */
	List<BankCard> getBankCardsByUserId(Long id);

	/**
	 * 根据用户id查找邀请信息
	 * 
	 * @param id
	 * @return
	 */
	Invitation getInvitee(Long id);

	/**
	 * 根据关键字查询邀请
	 * 
	 * @param keyword
	 * @param pager
	 * @return
	 */
	Pager<Invitation> findInvintation(String keyword, Pager<Invitation> pager);

	/**
	 * 根据条件查询第三方账户
	 * 
	 * @return
	 */
	Account findAccountByExample(AccountExample example);

	/**
	 * 增加第三方账户信息
	 * 
	 * @param account
	 * @return
	 */
	int insertAccount(Account account);

	/**
	 * 修改第三方账户信息
	 * 
	 * @param account
	 * @return
	 */
	int updateAccount(Account account);

	/**
	 * 根据生日查询用户ID集合
	 * 
	 * @param birthday
	 *            生日
	 * @return
	 */
	List<Long> findUserIdsByBirthday(Date birthday);

	/**
	 * 查询沉睡用户
	 * 
	 * @param keyword
	 * @param pager
	 * @return
	 */
	Pager<Financing> findSleepingUsers(Integer keyword, Pager<Financing> pager);

	/**
	 * 查询已跟进用户
	 * 
	 * @param keyword
	 * @param pager
	 * @return
	 */
	Pager<User> findFollowSleepingUsers(String keyword, String status,
			String account, String followDate, Pager<User> pager);

	/**
	 * 查询新注册用户
	 * 
	 * @param keyword
	 * @param pager
	 * @return
	 */
	Pager<User> findNewUsers(Integer keyword, Pager<User> pager);

	
	Invitation getInvitation(User user);
	/**
	 * 发送手机验证码
	 * @param mobile	接受验证码手机号
	 * @param type		缓存中key的前缀
	 * @return
	 */
	String sendIdentifyingCode(String mobile, String type);
	/**
	 * 获取手机验证码
	 * @param mobile	手机号码
	 * @param type		缓存中key的前缀
	 * @return
	 */
	String getIdentifyingCode(String mobile, String type);

	/**
	 * 
	 */
	
	//判断是不是新手
	Boolean isRookie(User user);
	
	BigDecimal getYesterdayIncome(User user);
	
	BigDecimal getUnpayIncome(User user);
	
	BigDecimal getUnpayAmount(User user);
	
	
	Date theFirstTimeToBuy(User user);
	Date theFirstTimeToRepay(User user);
	BigDecimal totalIncome(User user, Date beginDate, Date endDate);
	int countUserIncomeMoreThan(BigDecimal amount);
		
}
